#-*- coding: UTF-8 -*-
from pyramid.httpexceptions import HTTPFound
from pyramid.security import remember
from pyramid.security import forget




from scp.modelo.models import DBSession
from scp.modelo.Usuario import Usuario
from scp.modelo.Rol import Rol
from scp.modelo.Permiso import Permiso
from scp.modelo.Proyecto import Proyecto
from scp.modelo.Recurso import Recurso
from scp.modelo.Fase import Fase
from scp.modelo.AsignacionRecurso import AsignacionRecurso

from pyramid.response import Response
from pyramid.view import view_config
import json

import re

#@view_config(renderer='json')
def usuarios(request):
	"""Método controlador encargado de la administración de los Usuarios.
		URL asociada: /usuarios/{operacion}
		operacion:
			view, listado de usuarios
			create, creación de un nuevo usuario
			update, edición de un ususario
			destroy, elminiación de usuario
			cambiarPass, actualización de contrasenha del usuario
			cambiarEstado, se Activa/Inactiva al usuario
		@param request: Petición Http del cliente. 	
	"""

	print ">>>>>>>>>>>>>Controlador de Roles - Inicio>>>>>>>>>>>>>>"
	print "request:"
	print request

	print 'metodo:'
	
	methodRequest = request.method
	print methodRequest
	
	print 'request.url:'
	
	print request.url
	
	
	dicParametros = request.matchdict
	
		
	print "parametros abajo..."
	print request.params
	
	print 'request.body'
	print request.body 
	

	print "operación"
	print dicParametros.get('operacion')
	print "operación"
	
	
	if dicParametros.get('operacion') == 'update' or dicParametros.get('operacion') == 'create' or dicParametros.get('operacion') == 'cambiarPass':
		print 'entre el if de update'
		
		print 'json.loads(request.params[usuario])'
		usuario = json.loads(request.params['usuario'])
		print json.loads(request.params['usuario'])
		print 'rol.data'
		usuarioData = usuario.get('data')
		
	
	print 'dicParametros.get(operacion).find(?):' 
	print dicParametros.get('operacion').find('?')
	
	session = DBSession()
	if dicParametros.get('operacion') == 'view' and request.url.find('?') == -1:
		print 'respondí un diccionario normal'
		return {'content':'Hello!'}	
	elif dicParametros.get('operacion') == 'view':
		usuariosAll = session.query(Usuario).all()
		
		usuariosArray = []
		for usuarioIter in usuariosAll:
			aux = {'id': usuarioIter.id, 'nombre': usuarioIter.nombre, 'apellido': usuarioIter.apellido, 'username':usuarioIter.username, 'password':usuarioIter.password, 'correo':usuarioIter.correo, 'estado':usuarioIter.estado}
			usuariosArray.append(aux)
		
		
		responseView = Response()
		responseView.body = json.dumps(dict(success = True, usuarios = usuariosArray))
		responseView.content_type = 'application/json'
		return responseView
	elif dicParametros.get('operacion') == 'create':
		
		
		usuarioExiste = session.query(Usuario).filter_by(username=usuarioData.get('username')).first()
		
		if usuarioExiste == None:
			usuario = Usuario()
			usuario.nombre = usuarioData.get('nombre')
			usuario.apellido = usuarioData.get('apellido')
			usuario.correo = usuarioData.get('correo')
			usuario.username = usuarioData.get('username')
			usuario.password = usuarioData.get('password')
			usuario.estado = 'ACTIVO'
	
			session.add(usuario)		
			responseCreate = Response()
			responseCreate.body = json.dumps(dict(success = True, rsp='ok', msg = 'Usuario Creado Exitosamente!'))
			responseCreate.content_type = 'application/json'
		else:
			responseCreate = Response()
			responseCreate.body = json.dumps(dict(success = True, rsp='er', msg = 'Username ya existe!'))
			responseCreate.content_type = 'application/json'
		
		
		
		return responseCreate	
	elif dicParametros.get('operacion') == 'update':
		print 'entre en el if de update'
		
		
		usuarioUpdate = session.query(Usuario).filter_by(id=usuarioData.get('id')).first()
		
		usuarioUpdate.nombre = usuarioData.get('nombre')
		usuarioUpdate.apellido = usuarioData.get('apellido')
		usuarioUpdate.correo = usuarioData.get('correo')
		
		responseUpdate = Response()
		responseUpdate.body = json.dumps(dict(success = True))
		responseUpdate.content_type = 'application/json'
		return responseUpdate	
	elif dicParametros.get('operacion') == 'destroy':
		print 'entre en el if de update'
		
		idUsuarioEliminar = json.loads(request.params['param_id'])
		usuarioEliminar = session.query(Usuario).filter_by(id=idUsuarioEliminar).first()
		
		session.delete(usuarioEliminar)
		
		responseDestroy = Response()
		responseDestroy.body = json.dumps(dict(success = True))
		responseDestroy.content_type = 'application/json'
		return responseDestroy
	elif dicParametros.get('operacion') == 'cambiarPass':
		
		idUsuarioCambiarPass = usuarioData.get('id')
		usuarioCambiarPass = session.query(Usuario).filter_by(id=idUsuarioCambiarPass).first()
		
		responseCambiarPass = Response()
		
		print '>>>>usuarioCambiarPass.username'
		print usuarioCambiarPass.username
		
		print '>>>>usuarioCambiarPass.password'
		print usuarioCambiarPass.password
		
		print '>>>>usuarioData.get(idPassActCambPass)'
		print usuarioData.get('passwordActual')
		
		
		if usuarioCambiarPass.password == usuarioData.get('passwordActual'):
			usuarioCambiarPass.password = usuarioData.get('passwordModif')
			responseCambiarPass.body = json.dumps(dict(success = True, rsp='ok', msg = 'Contraseña actualizada!'))	
		else:
			responseCambiarPass.body = json.dumps(dict(success = True, rsp='er', msg = 'Contraseña actual incorrecta!'))	
		
		
		responseCambiarPass.content_type = 'application/json'
		return responseCambiarPass
	elif dicParametros.get('operacion') == 'cambiarEstado':
		#print 'entre en el if de update'
		
		idUsuarioCambiarEstado = json.loads(request.params['param_id'])
		usuarioCambiarEstado = session.query(Usuario).filter_by(id=idUsuarioCambiarEstado).first()
		
		if usuarioCambiarEstado.estado == 'ACTIVO':
			usuarioCambiarEstado.estado = 'INACTIVO'
		else:
			usuarioCambiarEstado.estado = 'ACTIVO'
		
		responseCambiarEstado = Response()
		responseCambiarEstado.body = json.dumps(dict(success = True))
		responseCambiarEstado.content_type = 'application/json'
		return responseCambiarEstado
		
	elif dicParametros.get('operacion') == 'verMiembros':
		proyectoID = json.loads(request.params['idProyecto'])
		
		proyecto = session.query(Proyecto).filter_by(id=proyectoID).first()
		
		usuariosDeProy = proyecto.usuarios
		
		IdUserArray = []
		for Iter in usuariosDeProy:
			aux = Iter.id
			IdUserArray.append(aux)
		
		usuariosAll = session.query(Usuario).filter(~Usuario.id.in_(IdUserArray)).filter(Usuario.estado == 'ACTIVO').all()
		
		print ('el ID del proyecto elegido')
		print (proyectoID)
		#.filter_by(proyectoID != usuario.proyecto)
		usuariosArray = []
		for usuarioIter in usuariosAll:
			aux = {'id': usuarioIter.id, 'nombre': usuarioIter.nombre, 'apellido': usuarioIter.apellido, 'username':usuarioIter.username, 'password':usuarioIter.password, 'correo':usuarioIter.correo, 'estado':usuarioIter.estado}
			usuariosArray.append(aux)
			
		
		
		responseVerMiembro = Response()
		responseVerMiembro.body = json.dumps(dict(success = True, miembros = usuariosArray))
		responseVerMiembro.content_type = 'application/json'
		return responseVerMiembro 
		
	elif dicParametros.get('operacion') == 'guardarMiembro':
		
		proyectoID = json.loads(request.params['idProyecto'])
		idsMiembros = json.loads(request.params['idsUsuarios'])
		
		proyecto = session.query(Proyecto).filter_by(id=proyectoID).first()
		
		miembrosArray = []
		miembrosArray = proyecto.usuarios
		
		for idMiembro in idsMiembros:
			print '>>todos los miembros>>>>>>>>>!!'
			print idMiembro
			user = session.query(Usuario).filter_by(id=idMiembro).first()
			miembrosArray.append(user)
		
		
		
		proyecto.usuarios = miembrosArray
		
		responseGuardarMiembro = Response()
		responseGuardarMiembro.body = json.dumps(dict(success = True, ))
		responseGuardarMiembro.content_type = 'application/json'
		return responseGuardarMiembro 
 
	elif dicParametros.get('operacion') == 'verMiembrosAsignados':
		
		print ('EEEEEEEEEEEEN MIEMBRO ASIGNADO')
		proyectoID = json.loads(request.params['idProyecto'])
		
		proyecto = session.query(Proyecto).filter_by(id=proyectoID).first()
		
		usuariosDeProy = proyecto.usuarios

		usuariosArray = []
		for usuarioIter in usuariosDeProy:
			aux = {'id': usuarioIter.id, 'nombre': usuarioIter.nombre, 'apellido': usuarioIter.apellido, 'username':usuarioIter.username, 'password':usuarioIter.password, 'correo':usuarioIter.correo, 'estado':usuarioIter.estado}
			usuariosArray.append(aux)
		
		responseMiembroAsignado = Response()
		responseMiembroAsignado.body = json.dumps(dict(success = True, usuarios = usuariosArray))
		responseMiembroAsignado.content_type = 'application/json'
		return responseMiembroAsignado 
	
	
	
		
	elif dicParametros.get('operacion') == 'editarMiembrosAsignados':
		
		proyectoID = json.loads(request.params['idProyecto'])
		#idsMiembro = json.loads(request.params['idMiembro'])
		
		proyecto = session.query(Proyecto).filter_by(id=proyectoID).first()
		
		usuariosDeProy = proyecto.usuarios

		usuariosArray = []
		for usuarioIter in usuariosDeProy:
			aux = {'id': usuarioIter.id, 'nombre': usuarioIter.nombre, 'apellido': usuarioIter.apellido, 'username':usuarioIter.username, 'password':usuarioIter.password, 'correo':usuarioIter.correo, 'estado':usuarioIter.estado}
			usuariosArray.append(aux)
		
		
		responseEditMiembroAsignado = Response()
		responseEditMiembroAsignado.body = json.dumps(dict(success = True, miembrosAsig = usuariosArray))
		responseEditMiembroAsignado.content_type = 'application/json'
		return responseEditMiembroAsignado 
	
	
	elif dicParametros.get('operacion') == 'eliminarMiembro':
		#este metodo si uso
		idMiembro =  json.loads(request.params['idMiembro'])
		proyectoID = json.loads(request.params['idProyecto'])
		
		miembro = session.query(Usuario).filter_by(id=idMiembro).first()
		recurso = session.query(Recurso).filter_by(proyecto_id=proyectoID).first()
		
		asignacionRecurso = session.query(AsignacionRecurso).filter_by(recurso_id=recurso.id, usuario_id=idMiembro).first()
		rol = session.query(Rol).filter_by(id=asignacionRecurso.rol_id).first()
		print 'nombre del rol es:'
		print rol.nombre
		proyecto = session.query(Proyecto).filter_by(id=proyectoID).first()
		usuariosDeProy = proyecto.usuarios
		p = len(usuariosDeProy)
		print ('la cantidad de usuarios q tiene este proyecto')
		print proyecto.nombre
		print p
		if rol.nombre != 'Lider de Proyecto':
			usuariosDeProy.remove(miembro)
			
			fasesAll = session.query(Fase).filter_by(proyecto_id=proyectoID).all()
			
			idsFases = []
			for iter in fasesAll:
				aux = iter.id
				idsFases.append(aux)
			
			recursosAll = session.query(Recurso).filter(Recurso.fase_id.in_(idsFases)).all()
			
			idsRecursos = []
			for iter1 in recursosAll:
				aux1 = iter1.id
				idsRecursos.append(aux1)
			
			recurAsignadoAll = session.query(AsignacionRecurso).filter(AsignacionRecurso.recurso_id.in_(idsRecursos)).filter(AsignacionRecurso.usuario_id == idMiembro).all()
			
			
			for iterRecurAsignado in recurAsignadoAll:
				print ('>>>>>>> estoy dentro del delete')
				asigRecurso = session.query(AsignacionRecurso).filter_by(id = iterRecurAsignado.id).first()
				session.delete(asigRecurso)
			
			#eliminamos Asignacion de Proyectos
			recursoProyecto = session.query(Recurso).filter(Recurso.proyecto_id == proyectoID).first()
			asigProyectoAll = session.query(AsignacionRecurso).filter(AsignacionRecurso.recurso_id == recursoProyecto.id).filter(AsignacionRecurso.usuario_id == idMiembro).all()
			for asigProy in asigProyectoAll:
				session.delete(asigProy)	
			
		
			
			responseDestroy = Response()
			responseDestroy.body = json.dumps(dict(success = True, rsp='ok', msg = 'Eliminación Exitosa!'))
			
			
		
		
		else:
			responseDestroy = Response()
			responseDestroy.body = json.dumps(dict(success = True, rsp='ok', msg = 'El Miembro es Lider del Proyecto!'))
		
		responseDestroy.content_type = 'application/json'
		
		return responseDestroy
	
	elif dicParametros.get('operacion') == 'viewUsuarios':
		
		usuariosAll = session.query(Usuario).filter_by(estado='ACTIVO').all()
		
		usuariosArray = []
		for usuarioIter in usuariosAll:
			aux = {'id': usuarioIter.id, 'nombre': usuarioIter.nombre, 'apellido': usuarioIter.apellido, 'username':usuarioIter.username, 'password':usuarioIter.password, 'correo':usuarioIter.correo, 'estado':usuarioIter.estado}
			usuariosArray.append(aux)
		
		
		responseView = Response()
		responseView.body = json.dumps(dict(success = True, usuarios = usuariosArray))
		responseView.content_type = 'application/json'
		return responseView
		
	
		
